package org.jw.testemunhopublico.repository.dao.impl;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.inject.Inject;
import javax.persistence.Query;

import org.jw.testemunhopublico.exceptions.NoFunctionalException;
import org.jw.testemunhopublico.repository.dao.PublicadorTurnoDaoIF;
import org.jw.testemunhopublico.repository.entities.PublicadorTurno;
import org.jw.testemunhopublico.repository.entities.Turno;
import org.jw.testemunhopublico.util.CollectionsUtil;
import org.jw.testemunhopublico.util.Constantes;
import org.jw.testemunhopublico.util.FileResourceUtil;
import org.jw.testemunhopublico.util.PropertiesUtil;
import org.springframework.stereotype.Repository;

@Repository
public class PublicadorTurnoDao extends GenericDao<PublicadorTurno> implements
		PublicadorTurnoDaoIF {

	private static final long serialVersionUID = 5317730677086110218L;

	private PropertiesUtil propertiesUtil;

	@SuppressWarnings("unchecked")
	public List<PublicadorTurno> listPublicadoresDoTurnoOrdenados(Turno turno,
			Date dataInicio, Date dataFinal) throws NoFunctionalException {
		beginTransaction();

		String queryFilename = Constantes.QUERY_LISTAR_PUBLICADORES_DO_TURNO_ORDENADOS;
		String queryString = "";
		try {
			queryString = FileResourceUtil.getContent(queryFilename);
		} catch (IOException e) {
			throw new NoFunctionalException(propertiesUtil.getValue(
					Constantes.MENSAGEM_ARQUIVO_NAO_ENCONTRADO, queryFilename));
		}

		SimpleDateFormat f = new SimpleDateFormat(Constantes.PATTERN_DATE_SQL);

		String t = turno.getIdTurno() + "";
		String di = f.format(dataInicio);
		String df = f.format(dataFinal);
		queryString = queryString
				.replaceAll(":turno", t)
				.replaceAll(":dataInicio", di)
				.replaceAll(":dataFinal", df);

		Query query = manager.createNativeQuery(queryString,
				PublicadorTurno.class);

		List<PublicadorTurno> result = query.getResultList();

		closeTransaction();

		if (!CollectionsUtil.isBlank(result))
			return result;
		return null;
	}

	@SuppressWarnings("unchecked")
	public List<Turno> listTurnosOrdenadosPorPublicadoresDisponiveis(
			Date dataInicio, Date dataFinal) throws NoFunctionalException {
		beginTransaction();

		String queryFilename = Constantes.QUERY_LISTAR_TURNOS_POR_PUBLICADORES_DISPONIVEIS;
		String queryString = "";
		try {
			queryString = FileResourceUtil.getContent(queryFilename);
		} catch (IOException e) {
			throw new NoFunctionalException(propertiesUtil.getValue(
					Constantes.MENSAGEM_ARQUIVO_NAO_ENCONTRADO, queryFilename));
		}

		Query query = manager.createQuery(queryString, Turno.class)
				.setParameter("dataInicio", dataInicio)
				.setParameter("dataFinal", dataFinal);

		List<Turno> result = query.getResultList();

		closeTransaction();

		if (!CollectionsUtil.isBlank(result))
			return result;
		return null;
	}

	public int updatePublicadorTurno(PublicadorTurno publicadorTurno)
			throws NoFunctionalException {
		beginTransaction();

		String queryFilename = Constantes.QUERY_UPDATE_PUBLICADOR_TURNO;
		String queryString = null;
		try {
			queryString = FileResourceUtil.getContent(queryFilename);
		} catch (IOException e) {
			throw new NoFunctionalException(propertiesUtil.getValue(
					Constantes.MENSAGEM_ARQUIVO_NAO_ENCONTRADO, queryFilename));
		}

		String d = publicadorTurno.getDesignado() ? "1" : "0";
		String p = publicadorTurno.getPublicador().getIdPublicador() + "";
		String t = publicadorTurno.getTurno().getIdTurno() + "";
		queryString = queryString
				.replaceAll(":designado", d)
				.replaceAll(":publicador", p)
				.replaceAll(":turno", t);

		Query query = manager.createNativeQuery(queryString);
		int result = query.executeUpdate();

		commitAndCloseTransaction();

		return result;
	}

	@Inject
	public void setPropertiesUtil(PropertiesUtil propertiesUtil) {
		this.propertiesUtil = propertiesUtil;
	}

}
